package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"time"
)

// 命令行参数
var (
	createFlag  = flag.String("create", "", "创建新的迁移（提供迁移名称）")
	upFlag      = flag.Bool("up", false, "执行向上迁移")
	downFlag    = flag.Bool("down", false, "执行向下迁移")
	versionFlag = flag.Int("version", 0, "指定迁移版本（与up/down一起使用）")
	dirFlag     = flag.String("dir", ".", "迁移文件目录")
)

func main() {
	flag.Parse()

	// 检查目录是否存在
	migrationDir := *dirFlag
	if _, err := os.Stat(migrationDir); os.IsNotExist(err) {
		log.Fatalf("迁移目录不存在: %s", migrationDir)
	}

	// 根据命令执行相应的操作
	if *createFlag != "" {
		// 创建新的迁移
		createMigration(*createFlag, migrationDir)
	} else if *upFlag {
		// 执行向上迁移
		fmt.Println("执行向上迁移")
		// TODO: 实现向上迁移逻辑
	} else if *downFlag {
		// 执行向下迁移
		fmt.Println("执行向下迁移")
		// TODO: 实现向下迁移逻辑
	} else {
		// 没有指定有效的命令参数
		flag.Usage()
	}
}

// 创建新的迁移
func createMigration(name string, dir string) {
	// 生成迁移文件名
	timestamp := time.Now().Format("20060102150405")
	baseName := fmt.Sprintf("%s_%s", timestamp, name)
	upFileName := filepath.Join(dir, baseName+".up.sql")
	downFileName := filepath.Join(dir, baseName+".down.sql")

	// 检查文件是否已存在
	if _, err := os.Stat(upFileName); !os.IsNotExist(err) {
		log.Fatalf("迁移文件已存在: %s", upFileName)
	}
	if _, err := os.Stat(downFileName); !os.IsNotExist(err) {
		log.Fatalf("迁移文件已存在: %s", downFileName)
	}

	// 创建向上迁移文件
	upFile, err := os.Create(upFileName)
	if err != nil {
		log.Fatalf("创建向上迁移文件失败: %v", err)
	}
	defer upFile.Close()
	upFile.WriteString("-- 向上迁移\n")
	fmt.Printf("创建向上迁移文件: %s\n", upFileName)

	// 创建向下迁移文件
	downFile, err := os.Create(downFileName)
	if err != nil {
		log.Fatalf("创建向下迁移文件失败: %v", err)
	}
	defer downFile.Close()
	downFile.WriteString("-- 向下迁移\n")
	fmt.Printf("创建向下迁移文件: %s\n", downFileName)
}
